package com.gxa.springboot229.controller;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gxa.springboot229.service.UserService;
import com.gxa.springboot229.util.JsonResult;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/sms")
public class SMSController {
    //java 要操作redis,是借助RedisTemplate
    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    @Resource
    private UserService userService;

    /**
     * VIP短信获取方法
     * @param phone
     * @return
     */
    @RequestMapping("/send")
    public Map send(@RequestParam(value = "phone")String phone){
        JsonResult jsonResult = new JsonResult();
        //判断该手机号是否是已注册用户
        //如果不是，则提示：该用户已经注册。
        //如果不是，可以注册，就需要调用阿里云短信接口，实现发送
        //接收来自阿里云的返回数据
        //如果不是就注册
        if(userService.findByPhone(phone) == 0) {

            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GHKWhKdwNLaDV3x1QKe", "YVWXwVjvBczPPxih5ktJjOJ3UxllFV");
            IAcsClient client = new DefaultAcsClient(profile);

            CommonRequest request = new CommonRequest();
            request.setSysMethod(MethodType.POST);
            request.setSysDomain("dysmsapi.aliyuncs.com");
            request.setSysVersion("2017-05-25");
            request.setSysAction("SendSms");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            request.putQueryParameter("PhoneNumbers", phone);
            request.putQueryParameter("SignName", "yunHua云华");
            request.putQueryParameter("TemplateCode", "SMS_204971085");

            //生成4位随机数验证码(1-9)
            String code = "";
            for (int i = 0; i < 4; i++) {
                //code.concat(String.valueOf());
                code += (int) (Math.random() * 9 + 1);
            }
            // 给阿里云短信模板中的${code}赋值，json格式
            request.putQueryParameter("TemplateParam", "{'code':" + code + "}");
            try {
                CommonResponse response = client.getCommonResponse(request);
                // 获取的验证码数据,
                String data = response.getData();
                //{"Message":"OK","RequestId":"CBC83055-A113-483A-91B2-0E4C56CCC643","BizId":"790710603115763709^0","Code":"OK"}

                ObjectMapper mapper = new ObjectMapper();
                Map <String, Object> tmpMap = mapper.readValue(data, Map.class);
                if ("OK".equals(tmpMap.get("Code"))) {
                    jsonResult.setCode("1");
                    jsonResult.setMsg("验证码发送成功");

                    // 将数据保存在redis服务器上, 15分钟有效
                    //1.利用RedisTemplate绑定要操作的数据类型，生成对应的操作符对象
                    ValueOperations <String, Object> operations = redisTemplate.opsForValue();
                    //2.利用操作符对象该类型的数据赋值
                    operations.set("sms:" + phone, code, 5, TimeUnit.MINUTES);//设置生存时间

                } else {
                    jsonResult.setCode("0");
                    jsonResult.setMsg("验证码发送失败,请检查手机号或稍后再试");
                }


            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

            // 将数据保存在redis服务器上, 15分钟有效
            //1.利用RedisTemplate绑定要操作的数据类型，生成对应的操作符对象
            ValueOperations <String, Object> operations = redisTemplate.opsForValue();
            //2.利用操作符对象该类型的数据赋值
            operations.set("sms:" + phone, code, 5, TimeUnit.MINUTES);//设置生存时间
        }else {
            jsonResult.setCode("0");
            jsonResult.setMsg("您已经是VIP 请直接登录！");
        }
        return jsonResult.getValues();
    }
}
